|
このテクニカルノートでは、QuickTime 6 に導入された
ChooseMovieClock API について説明します。
具体的には、この呼び出しを、ビデオ出力コンポーネントを対象に使う方法と、これまでムービーのクロックをリセットするために、SetMovieMasterClock を使用していた場面で使用する方法を説明します。
この情報は主に、ビデオ出力コンポーネントを使用する開発者、および
SetMovieMasterClock
を使用してムービーのマスタクロックを変更している開発者を対象としています。
[2002 年 5 月 7 日] |
誰がマスタクロックか
クロックコンポーネントは、時間に関連したサービスを提供し、時間基準としてムービーツールボックスにより使用されます。ムービーマスタクロックは、ムービーの時間基準を提供する機能です。
時間基準は、ムービーにおける現在時間と時間経過速度を定義します。時間経過速度は、ムービーにおける時間経過の速度と方向を指定します。また、時間基準には、時間基準のために計時機能を提供するクロックへの参照が含まれています。詳細については、Time and the Movie Toolbox を参照してください。
アプリケーションがサウンドトラックを含むムービーを開く時、QuickTime
は、その「サウンドクロック」をムービーマスタクロックとして使います。その「サウンドクロック」とは、選択されているオーディオ出力デバイスにより直接提供されるクロックコンポーネントです。選択されているオーディオ出力デバイスがクロックコンポーネントを提供していない場合は、サンプルがハードウェアに出力されるのを観察し、そこからクロックを取得するクロックがサウンドクロックとなります。
つまり、音声と映像の両方のメディアを含むムービーを再生すると、映像は、オーディオハードウェアの再生速度で再生されることになります。ムービーにサウンドトラックがない場合、QuickTime
は、システムクロックをムービーマスタクロックとして使います。
QuickTime がこの処理を通じて選択するクロックをデフォルトクロックと呼びます。
先頭に戻る
ChooseMovieClock API
ChooseMovieClock
は、デフォルトクロックをムービーに割り当てます。SetMovieMasterClock
を使ってムービーのマスタクロックを変えた場合、またはムービーのクロックをデフォルトクロックにリセットしたい時には、ChooseMovieClock
API を使います。
void ChooseMovieClock( Movie m, long flags );
m - この操作の対象となるムービー。アプリケーションは、NewMovie 、NewMovieFromFile 、および
NewMovieFromHandle などの関数を使ってこのムービーの識別子を取得します。
flags - 現在使用されていません。0
に設定する必要があります。
|
先頭に戻る
関連コンポーネント - ビデオ出力コンポーネントクロック
ビデオ出力クロックは、特定のビデオ出力コンポーネントに関連付けられているクロックコンポーネントです。このクロックでは、QuickTime
ムービーによって使用される時間基準を、特定の出力ハードウェアデバイスのクロックに基づくようにすることで、その出力ハードウェア使用時の映像と音声を同期させます。
先頭に戻る
ビデオ出力コンポーネントクロックの使用
アプリケーションはビデオ出力コンポーネントに関連付けられているクロックコンポーネントを要求し、そのクロックをムービーマスタクロックとして使用することができます。
ビデオ出力コンポーネントの使用時に、QTVideoOutputGetClock
を呼び出すことによって、そのビデオコンポーネントに関連付けられているクロックコンポーネントのインスタンスを取得できます。
このインスタンスを取得した後で、SetMovieMasterClock
を呼び出すことによって、ムービーと関連付けることができます。表示モードの変更はクロックコンポーネントに影響を及ぼすこともあるので、アプリケーションは、QTVideoOutputBegin
の呼び出しと QTVideoOutputEnd の呼び出しの間に限って QTVideoOutputGetClock の呼び出しを行うべきです。
ムービーマスタクロックをデフォルトクロックにリセットしたい時は、ChooseMovieClock
を使います。
これまで SetMovieMasterClock を使ってデフォルトクロックにリセットしていた場合は、
ChooseMovieClock を使う新しい方法に変更してください。
ChooseMovieClock(myMovie, 0);
|
先頭に戻る
関連コンポーネント - サウンド出力コンポーネント
サウンド出力コンポーネントは、特定のハードウェアデバイス上で音声を識別、制御、再生するソフトウェアモジュールです。ビデオ出力コンポーネントは、クロックコンポーネントだけでなく、対応するサウンド出力コンポーネントも持つことができます。
開発者は、MediaSetSoundOutputComponent
を呼び出すことによって、メディアハンドラが使用するサウンド出力コンポーネントを変更できます。これにより、ビデオ出力デバイスに関連付けられているオーディオデバイス、システムにインストールされているサウンド出力デバイス、デフォルトのサウンド出力デバイスの中から、使用するデバイスを選択できるようになります。
MediaSetSoundOutputComponent を呼び出すと、ムービーマスタクロックが変更されることに注意してください。
先頭に戻る
ビデオ出力コンポーネントに関連付けられているサウンド出力コンポーネントの使用
ビデオ出力コンポーネントに関連付けられているサウンド出力コンポーネントを見つけるには、QTVideoOutputGetIndSoundOutput
を使います。コンポーネントを取得できたら、MediaSetSoundOutputComponent
を呼び出して、メディアハンドラが使用するサウンド出力コンポーネントを設定します。
Component theSoundOut = 0;
ComponentInstance theVOutClock = NULL;
UnsignedFixed theSupportedAudioRate, myWantedAudioRate = eAudioRate48khz;
...
// このビデオ出力コンポーネントは
// サウンド出力コンポーネントに関連付けられているか?
if (ComponentFunctionImplemented(theInstance,
kQTVideoOutputGetIndSoundOutputSelect)) {
// このビデオ出力コンポーネントに関連付けられている
// 最初のサウンド出力コンポーネントを取得する
err = QTVideoOutputGetIndSoundOutput(inVOComponentInstance,
1, &theSoundOut);
if (err || 0 == theSoundOut) goto bail;
// すべてのサウンド出力コンポーネントがすべてのサンプル速度をサポートしている
// わけではない。siSampleRateAvailable セレクタと
// GetSoundOutputInfo を使って確める
theSupportedAudioRate = MyChooseAudioRate(myWantedAudioRate,
theSoundOut);
// 音声出力のサンプル速度を設定する
err = SoundComponentSetInfo((ComponentInstance)theSoundOut,
NULL, siSampleRate, (void *)theSupportedAudioRate);
if (err) goto bail;
// 音声トラックメディアごとにサウンド出力コンポーネントを設定する
for (i = 0;i < theNumberAudioTracks; i++) {
err = MediaSetSoundOutputComponent(inAudioMediaHandlers[i],
theSoundOut);
if (err) goto bail;
}
}
// ビデオ出力クロックをマスタクロックとして使用する
// ビデオ出力クロックはサウンド出力コンポーネントの後で設定する
// 順序が逆だとクロックの設定がデフォルトに戻る
if (ComponentFunctionImplemented(inVOComponentInstance,
kQTVideoOutputGetClockSelect)) {
err = QTVideoOutputGetClock(inVOComponentInstance, &theVOutClock);
if (err || NULL == theVOutClock) goto bail;
SetMovieMasterClock(inMovie, (Component)theVOutClock, NULL);
}
|
先頭に戻る
デフォルトのサウンド出力コンポーネントへの切り替え
デフォルトのサウンド出力コンポーネントへ切り替えるには、 MediaSetSoundOutputComponent
を使って、コンポーネントパラメータとして NULL を渡します。
// サウンド出力コンポーネントをデフォルトのサウンド出力に設定
for (i = 0;i < theNumberAudioTracks; i++) {
err = MediaSetSoundOutputComponent(theAudioMediaHandler[i], NULL);
if (err) goto bail;
}
// デフォルトクロックへの切り替え
ChooseMovieClock(myMovie, 0);
|
先頭に戻る
クロックの選択
関連コンポーネント
- サウンド出力コンポーネント
の節で言及したように、サウンド出力コンポーネントを選択するとマスタクロックがリセットされます。したがって、サウンド出力コンポーネントを選択した後で、ムービーのマスタクロックを設定する必要があります。ムービーの音声と映像を同期させるために、ビデオ出力クロック(ビデオ出力コンポーネントを使用している場合は理にかなった選択)、またはデフォルトクロックのどちらも選択できます。
ビデオ出力クロックを使用する場合は、QTVideoOutputEnd
を呼び出す前に必ずムービーのクロックをデフォルトクロックに戻してください。
先頭に戻る
ビデオ出力コンポーネントの使用
ビデオ出力コンポーネントを使用する場合は、 SetMovieMasterClock
を呼び出し、ビデオ出力クロックのインスタンスを渡します。
// ビデオ出力クロックをマスタクロックとして使用する
// ビデオ出力クロックはサウンド出力コンポーネントの後で設定する
// 順序が逆だとクロックの設定がデフォルトに戻る
if (ComponentFunctionImplemented(theVOComponentInstance,
kQTVideoOutputGetClockSelect)) {
err = QTVideoOutputGetClock(gVOComponentInstance, &theVOutClock);
if (err || NULL == theVOutClock) goto bail;
SetMovieMasterClock(myMovie, (Component)theVOutClock, NULL);
}
|
先頭に戻る
デフォルトクロックへの切り替え
デフォルトクロックへ切り替えたり選択する時には、ChooseMovieClock を使います。
// デフォルトクロックを使用する
ChooseMovieClock(myMovie, 0);
|
先頭に戻る
注意事項
すべてのサウンドデバイスがクロックを持っているわけではなく、またすべてのビデオコンポーネントにクロックコンポーネントが関連付けられているわけではありません。必ず確認してください。
SetMovieMasterClock と ChooseMovieClock
は、お互いの設定を無効にします。最後に呼び出された API がクロックを設定します。
MediaSetSoundOutputComponent により、ムービーマスタクロックが変更される場合があります。したがって、ムービーマスタクロックのビデオ出力クロックへの変更は、サウンド出力デバイスを設定した後に行う必要があります。順序が逆だと、クロックの設定がデフォルトに戻ります。
先頭に戻る
サンプルコード
SimpleVideoOut
SoftVideoOutputComponent / SoftCodec Transfer
Codec
先頭に戻る
参考文献
Video Output Components
Transfer Codecs for Video Output Components
Accelerated Video Support
Time and the Movie Toolbox
About Clock Components
先頭に戻る
ダウンロード
先頭に戻る
|